#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1010;
const int INF=0x3f3f3f3f;
int dp[51][maxn],q[maxn],l,r;
int n,m,x;
struct node
{
	int pos,e;
	bool friend operator <(node a,node b)
	{
		return a.pos<b.pos;
	}
}a[51][maxn];
int min(int x,int y)
{
	return x<y?x:y;
}
int abs(int x)
{
	if(x<0)return -x;
	return x;
}
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d%d%d",&m,&n,&x);	
		for(int i=1;i<=m;i++)
			for(int j=1;j<=n;j++)
				scanf("%d",&a[i][j].pos);
		for(int i=1;i<=m;i++)
			for(int j=1;j<=n;j++)
				scanf("%d",&a[i][j].e);
		memset(dp,0x3f3f3f3f,sizeof(dp));
		sort(a[1]+1,a[1]+n+1);
		for(int i=1;i<=n;i++)
			dp[1][i]=abs(x-a[1][i].pos)+a[1][i].e;
		for(int i=2;i<=m;i++)
		{
			memset(q,0,sizeof(q));
			l=r=1;
			sort(a[i]+1,a[i]+n+1);
			int k=1;
			dp[i-1][0]=INF;
			for(int j=1;j<=n;j++)
			{
				while(a[i-1][k].pos<=a[i][j].pos&&k<=n)
				{
					while(l<=r&&dp[i-1][k]-a[i-1][k].pos<=dp[i-1][q[r]]-a[i-1][q[r]].pos)r--;
					r++;q[r]=k;
					k++;
				}

				dp[i][j]=min(dp[i][j],dp[i-1][q[l]]-a[i-1][q[l]].pos+a[i][j].pos+a[i][j].e);
			}
			memset(q,0,sizeof(q));
			l=r=1; k=n;
			for(int j=n;j>=1;j--)
			{
				while(a[i-1][k].pos>=a[i][j].pos&&k>=1)
				{
					while(l<=r&&dp[i-1][k]+a[i-1][k].pos<=dp[i-1][q[r]]+a[i-1][q[r]].pos)r--;
					r++;q[r]=k;
					k--;
				}
				dp[i][j]=min(dp[i][j],dp[i-1][q[l]]+a[i-1][q[l]].pos-a[i][j].pos+a[i][j].e);
			}
		}
		int ans=0x3f3f3f3f;
		for(int i=1;i<=n;i++)
			ans=min(ans,dp[m][i]);
		printf("%d\n",ans);
	}
	return 0;
}
